// #include  <stdio.h>
// #include <stdlib.h>
// #include  <string.h>
// #include <assert.h>
// #include  <stdbool.h>
//
// //学会创建函数指针-->(*指针名)替换函数名
//
//
// //学会使用函数指针
//
// int Max(int a,int b)
// {
//     return a>b?a:b;
// }
//
// //函数指针一般常见应用就是当做函数参数
// //回调函数
//
// //以函数指针为参数的函数叫做回调函数
// void test(int(*t)(int a,int b),int a,int b)
// {
//     printf("%d\n",t(a,b));
// }
//
// int sum(int a,int b)
// {
//     return a+b;
// }
// //复杂函数指针 给类型起别名
//
// void test_typedef()
// {
//     //给小写int起别名为大写INT
//     //typedef 通用方法 用定义的名字替换掉typedef语句中的名字 去掉typedef即可
//     typedef int INT;
//     INT num=123;
//
//     typedef int ARRAY[3];
//     ARRAY arr={1,2,3};
//
//     typedef int(*FUNC)(int a,int b);
//     FUNC pFunc=NULL; //int(*FUNC)(int a,int b);
//
//     //注意一个陷阱 p是指针 q不是指针
//      int *p,q;
//
//     typedef int* PINT;
//     PINT p1,p2; //int *p1,int *p2; 这两个都是指针
//     p1=&num;
//     p2=&num;
//
// }
//
//
// int MaxTwo(int a,int b)
// {
//     return a>b?a:b;
// }
//
// //返回函数指针的函数
// //借用typedef来完成
// typedef int(*MAX_FUNC)(int a,int b);
//
// MAX_FUNC get_max_func(MAX_FUNC pFunc,int  a,int b)
// {
//     pFunc(a,b);
//     return pFunc;
// }
// //把函数名和参数写到返回函数指针的类型*号后面
// int(*get_max_func1(int(*pmax)(int,int),int a,int b))(int a,int b)
// {
//     pmax(a,b);
//     return  pmax;
// }
//
// //万能指针充当函数指针
// void print_data()
// {
//     printf("万能指针充当函数指针\n");
// }
//
// //函数指针数组
//
//
// int main()
// {
//     int result = Max(10,20);
//     printf("%d\n",result);
//
//     int(*pFunc)(int a,int b)=NULL;
//     //学会使用函数指针调用函数
//     //pFunc=Max;
//     //推荐这种写法
//     pFunc=&Max;
//     //int(*pFunc)(int,int)=Max;
//     result = pFunc(10,20);
//     //result = (*pFunc)(10,20); //这种写法不推荐
//     printf("%d\n",result);
//
//     test(Max,10,20);
//     test(sum,10,20);
//     int(*((*pf))(int(*pmax)(int,int),int a,int b))(int a,int b)=&get_max_func1;
//     pf(Max,10,20);
//
//     void(*pf1)()=&print_data;
//
//     pf1();
//
//     void* p=&print_data;
//
//     //函数指针类型
//     //万能指针使用前必须前置类型转换
//   ((void(*)())p)();
//
//
//     //指针数组 数组指针和指针数组的区别 看哪个在后面就是哪个
//
//     //数组指针
//     int(*mm)[4]=NULL;
//      mm=(int(*)[4])malloc(sizeof(int[4])*2); //2行4列的数组
//
//     for (int i=0;i<2;i++)
//     {
//         for (int j=0;j<4;j++)
//         {
//             mm[i][j]=i+j;
//             printf("%d\t",mm[i][j]);
//         }
//         printf("\n");
//     }
//
//     //指针数组
//     int* parr[3]={NULL,NULL,NULL};
//     char* pstr[3]={"aaa","bbb","ccc"};
//
//     for  (int i=0;i<3;i++)
//     {
//         puts(pstr[i]);
//     }
//
//     int(*tFunc)(int a,int b)=NULL;
//     //函数指针数组
//     int(*mFunc[4])(int a,int b)={NULL,NULL,NULL,NULL};
//
//
//     int(*)
//
//
//
//
//
//     return 0;
// }
